home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-1 / Inter.Net 55-1.iso / CBuilder / Setup / BCB / data.z / ipcthrd.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-09  |  10.6 KB  |  336 lines

  1. //----------------------------------------------------------------------------
  2. //Borland C++Builder
  3. //Copyright (c) 1987, 1998 Borland International Inc. All Rights Reserved.
  4. //----------------------------------------------------------------------------
  5. //----------------------------------------------------------------------------
  6. #ifndef IPCThrdHPP
  7. #define IPCThrdHPP
  8. //----------------------------------------------------------------------------
  9. #include <vcl.h>
  10. #include <Windows.hpp>
  11. #include <Classes.hpp>
  12. #include <SysUtils.hpp>
  13. #include <System.hpp>
  14.  
  15. //-- type declarations -------------------------------------------------------
  16.  
  17. #define IPCDEBUG
  18.  
  19. // Win32 Helper Classes
  20.  
  21. //THandledObject
  22. class THandledObject : public TObject
  23. {
  24. protected:
  25.    HANDLE FHandle;
  26. public:
  27.    __fastcall virtual ~THandledObject();
  28.    __property HANDLE Handle = {read=FHandle, nodefault};
  29. __published:
  30.    __fastcall THandledObject::THandledObject(void) : TObject() { }
  31. };
  32.  
  33. //TEvent
  34. class TEvent : public THandledObject
  35. {
  36. public:
  37.    void __fastcall Signal(void);
  38.    void __fastcall Reset(void);
  39.    bool __fastcall Wait(Integer TimeOut);
  40.    __fastcall TEvent::TEvent(const AnsiString Name, bool Manual);
  41. };
  42.  
  43. //TMutex
  44. class TMutex : public THandledObject
  45. {
  46. public:
  47.    __fastcall TMutex(const AnsiString Name);
  48.    bool __fastcall Get(Integer TimeOut);
  49.    bool __fastcall Release(void);
  50. };
  51.  
  52. //TSharedMem
  53. class TSharedMem : public THandledObject
  54. {
  55. private:
  56.    AnsiString FName;
  57.    int FSize;
  58.    bool FCreated;
  59.    void *FFileView;
  60. public:
  61.    __fastcall TSharedMem(const AnsiString Name, int Size);
  62.    __fastcall virtual ~TSharedMem(void);
  63.    __property AnsiString Name = {read=FName, nodefault};
  64.    __property int Size = {read=FSize, nodefault};
  65.    __property Pointer Buffer = {read=FFileView, nodefault};
  66.    __property bool Created = {read=FCreated, nodefault};
  67. };
  68.  
  69. //Debug Tracing
  70. #if defined(IPCDEBUG)
  71.  
  72. #define TRACE_BUF_SIZE Integer(204800)
  73. #define TRACE_BUFFER "TRACE_BUFFER"
  74. #define TRACE_MUTEX "TRACE_MUTEX"
  75.  
  76. typedef struct _TTraceEntry
  77. {
  78.    int Size;
  79.    int Time;
  80.    Char Msg[1];
  81. } TTraceEntry, * PTraceEntry;
  82.  
  83. class TIPCTracer : public TObject
  84. {
  85.  
  86. private:
  87.    char FIDName[10];
  88.    TSharedMem *FSharedMem;
  89.    TMutex *FMutex;
  90.    PTraceEntry __fastcall MakePtr(int Ofs);
  91.    PTraceEntry __fastcall FirstEntry(void);
  92.    PTraceEntry __fastcall NextEntry(void);
  93.  
  94. public:
  95.    __fastcall TIPCTracer(AnsiString ID);
  96.    __fastcall virtual ~TIPCTracer(void);
  97.    void __fastcall Add(PChar AMsg);
  98.    void __fastcall GetList(TStrings *List);
  99.    void __fastcall Clear(void);
  100. };
  101.  
  102. #endif  // IPCDEBUG
  103.  
  104. //IPC Classes
  105.  
  106. #define MAX_CLIENTS Byte(6)
  107. #define TIMEOUT Smallint(2000)
  108. #define BUFFER_NAME "BUFFER_NAME"
  109. #define BUFFER_MUTEX_NAME "BUFFER_MUTEX"
  110. #define MONITOR_EVENT_NAME "MONITOR_EVENT"
  111. #define CLIENT_EVENT_NAME "CLIENT_EVENT"
  112. #define CONNECT_EVENT_NAME "CONNECT_EVENT"
  113. #define CLIENT_DIR_NAME "CLIENT_DIRECTORY"
  114. #define CLIENT_DIR_MUTEX "DIRECTORY_MUTEX"
  115.  
  116. class TIPCThread;
  117.  
  118. class EMonitorActive : public Exception
  119. {
  120. public:
  121.    __fastcall EMonitorActive::EMonitorActive(const AnsiString p0) : Exception(p0) { }
  122.    __fastcall EMonitorActive::EMonitorActive(const AnsiString p0, const TVarRec *p1, const
  123.        int p1_Size) : Exception(p0, p1, p1_Size) { }
  124.    __fastcall EMonitorActive::EMonitorActive(Integer p0) : Exception(p0) { }
  125.    __fastcall EMonitorActive::EMonitorActive(Integer p0, const TVarRec *p1, const int
  126.        p1_Size) : Exception(p0, p1, p1_Size) { }
  127.    __fastcall EMonitorActive::EMonitorActive(const AnsiString p0, int p1) : Exception(
  128.        p0, p1) { }
  129.    __fastcall EMonitorActive::EMonitorActive(const AnsiString p0, const TVarRec *p1,
  130.        const int p1_Size, int p3) : Exception(p0, p1, p1_Size, p3) { }
  131.    __fastcall EMonitorActive::EMonitorActive(int p0, int p1) : Exception(p0,
  132.        p1) { }
  133.    __fastcall EMonitorActive::EMonitorActive(int p0, const TVarRec *p1, const
  134.        int p1_Size, int p3) : Exception(p0, p1, p1_Size, p3) { }
  135. };
  136.  
  137. //TIPCEvent
  138.  
  139. enum TEventKind { evMonitorAttach,
  140.                   evMonitorDetach,
  141.                   evMonitorSignal,
  142.                   evMonitorExit,
  143.                   evClientStart,
  144.                   evClientStop,
  145.                   evClientAttach,
  146.                   evClientDetach,
  147.                   evClientSwitch,
  148.                   evClientSignal,
  149.                   evClientExit
  150. };
  151.  
  152. enum TClientFlag {cfError, cfMouseMove, cfMouseDown, cfResize, cfAttach};
  153.  
  154. typedef Set<TClientFlag, cfError, cfAttach>  TClientFlags;
  155.  
  156. typedef struct _TEventData
  157. {
  158.    short X;
  159.    short Y;
  160.    TClientFlag Flag;
  161.    TClientFlags Flags;
  162. }TEventData, * PEventData;
  163.  
  164. typedef void __fastcall (__closure *TConnectEvent)(TIPCThread* Sender,
  165.                                                    bool Connecting);
  166.  
  167. typedef void __fastcall (__closure *TDirUpdateEvent)(TIPCThread* Sender);
  168.  
  169. typedef void __fastcall (__closure *TIPCNotifyEvent)(TIPCThread *Sender,
  170.                                                      const TEventData &Data);
  171.  
  172. typedef struct _TIPCEventInfo
  173. {
  174.    int FID;
  175.    TEventKind FKind;
  176.    TEventData FData;
  177. }TIPCEventInfo, * PIPCEventInfo;
  178.  
  179. class TIPCEvent : public TEvent
  180. {
  181. private:
  182.    TIPCThread *FOwner;
  183.    int FOwnerID;
  184.    TSharedMem *FSharedMem;
  185.    TIPCEventInfo *FEventInfo;
  186.    int __fastcall GetID(void);
  187.    void __fastcall SetID(int Value);
  188.    TEventKind __fastcall GetKind(void);
  189.    void __fastcall SetKind(TEventKind Value);
  190.    TEventData __fastcall GetData(void);
  191.    void __fastcall SetData(const TEventData& Value);
  192. public:
  193.    __fastcall TIPCEvent::TIPCEvent(TIPCThread *AOwner,
  194.                                         const AnsiString Name,
  195.                                         bool Manual);
  196.    __fastcall virtual ~TIPCEvent(void);
  197.    void __fastcall Signal(TEventKind Kind);
  198.    void __fastcall SignalID(TEventKind Kind, int ID);
  199.    void __fastcall SignalData(TEventKind Kind, int ID, const TEventData &Data);
  200.    bool __fastcall WaitFor(int TimeOut, int ID, TEventKind Kind);
  201.    __property int ID = {read=GetID, write=SetID, nodefault};
  202.    __property TEventKind Kind = {read=GetKind, write=SetKind, nodefault};
  203.    __property TEventData Data = {read=GetData, write=SetData};
  204.    __property int OwnerID = {read=FOwnerID, write=FOwnerID, nodefault};
  205.    __property TIPCEventInfo* EventInfo = {read=FEventInfo, write=FEventInfo};
  206. };
  207.  
  208. //TClientDirectory
  209.  
  210. struct TClientDirEntry
  211. {
  212.    int ID;
  213.    Char Name[59];
  214. };
  215.  
  216. typedef TClientDirEntry TClientDirRecords[MAX_CLIENTS];
  217. typedef TClientDirRecords* PClientDirRecords;
  218.  
  219. class TClientDirectory : public TObject
  220. {
  221. private:
  222.    int *FClientCount;
  223.    int *FMonitorID;
  224.    int FMaxClients;
  225.    TMutex *FMutex;
  226.    TSharedMem *FSharedMem;
  227.    TClientDirRecords *FDirBuffer;
  228.    int __fastcall GetCount(void);
  229.    AnsiString __fastcall GetClientName(int ClientID);
  230.    TClientDirEntry __fastcall GetClientRec(int Index);
  231.    int __fastcall IndexOf(int ClientID);
  232.    int __fastcall GetMonitorID(void);
  233.    void __fastcall SetMonitorID(int MonitorID);
  234. public:
  235.    __fastcall TClientDirectory::TClientDirectory(int MaxClients);
  236.    __fastcall virtual ~TClientDirectory(void);
  237.    int __fastcall AddClient(int ClientID, const AnsiString AName);
  238.    int __fastcall Last(void);
  239.    bool __fastcall RemoveClient(int ClientID);
  240.    __property int Count = {read=GetCount, nodefault};
  241.    __property TClientDirEntry ClientRec[int Index] = {read=GetClientRec};
  242.    __property int MonitorID = {read=GetMonitorID, write=SetMonitorID, nodefault};
  243.    __property AnsiString Name[int ClientID] = {read=GetClientName};
  244. };
  245.  
  246. //TIPThread
  247.  
  248. enum TState { stInActive, stDisconnected, stConnected };
  249.  
  250. class TIPCThread : public TThread
  251. {
  252. protected:
  253. #if defined(IPCDEBUG)
  254.    TIPCTracer *FTracer;
  255. #endif
  256.    int FID;
  257.    AnsiString FName;
  258.    TState FState;
  259.    TClientDirectory *FClientDirectory;
  260.    TIPCEvent *FClientEvent;
  261.    TIPCNotifyEvent FOnSignal;
  262.    TConnectEvent FOnConnect;
  263. public:
  264.    TIPCEvent *FConnectEvent;
  265.    TIPCEvent *FMonitorEvent;
  266.    __fastcall TIPCThread::TIPCThread(int AID, const AnsiString AName);
  267.    __fastcall virtual ~TIPCThread(void);
  268.    virtual void __fastcall Activate(void) = 0;
  269.    virtual void __fastcall DeActivate(void) = 0;
  270.    void __fastcall DbgStr(const AnsiString S);
  271.    __property TState State = {read=FState, nodefault};
  272. __published:
  273.    __property TConnectEvent OnConnect = {read=FOnConnect, write=FOnConnect};
  274.    __property TIPCNotifyEvent OnSignal = {read=FOnSignal, write=FOnSignal};
  275. };
  276.  
  277. //TIPCMonitor
  278.  
  279. class TIPCMonitor : public TIPCThread
  280. {
  281. private:
  282.    int FClientID;
  283.    bool FAutoSwitch;
  284.    TDirUpdateEvent FOnDirUpdate;
  285. protected:
  286.    void __fastcall ConnectToClient(int ID);
  287.    void __fastcall DisconnectFromClient(bool Wait);
  288.    void __fastcall DoOnSignal(void);
  289.    AnsiString __fastcall GetClientName(void);
  290.    virtual void __fastcall Execute(void);
  291.    void __fastcall SetCurrentClient(int ID);
  292.    void __fastcall DoOnDirUpdate(void);
  293. public:
  294.    __fastcall TIPCMonitor::TIPCMonitor(int AID, const AnsiString AName);
  295.    virtual void __fastcall Activate(void);
  296.    virtual void __fastcall DeActivate();
  297.    void __fastcall SignalClient(const TClientFlags Value);
  298.    void __fastcall GetClientNames(TStringList* List);
  299.    void __fastcall GetDebugInfo(TStrings *List);
  300.    void __fastcall SaveDebugInfo(const AnsiString FileName);
  301.    void __fastcall ClearDebugInfo(void);
  302.    __property bool AutoSwitch = {read=FAutoSwitch, write=FAutoSwitch, nodefault};
  303.    __property AnsiString ClientName = {read=GetClientName, nodefault};
  304.    __property int ClientID = {read=FClientID, write=SetCurrentClient, nodefault};
  305.    __property TDirUpdateEvent OnDirectoryUpdate = {read=FOnDirUpdate, write=FOnDirUpdate};
  306. };
  307.  
  308. //TIPCClient
  309.  
  310. class TIPCClient : public TIPCThread
  311. {
  312.  
  313. private:
  314.    TIPCEvent *FWaitEvent;
  315.    void __fastcall ConnectToMonitor(void);
  316.    void __fastcall DisconnectFromMonitor(bool Wait);
  317. protected:
  318.    virtual void __fastcall Execute(void);
  319. public:
  320.    virtual void __fastcall Activate(void);
  321.    virtual void __fastcall DeActivate(void);
  322.    int __fastcall ClientCount(void);
  323.    void __fastcall SignalMonitor(const TEventData &Data);
  324.    void __fastcall MakeCurrent(void);
  325.    __fastcall TIPCClient::TIPCClient(int AID, const AnsiString AName)
  326.                              : TIPCThread(AID, AName) { }
  327. };
  328.  
  329. //-- var, const, procedure ---------------------------------------------------
  330. extern bool __fastcall IsMonitorRunning(THandle& Hndl);
  331. //-- template instantiations -------------------------------------------------
  332. template class TClientFlags ;
  333. //-- end unit ----------------------------------------------------------------
  334. #endif    // IPCThrd
  335.  
  336.